﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AIMLbot.Utils;

namespace CsClient
{
    static class Komunikacja
    {
        static public AIMLbot.Bot agentAIML; // Chatterbot AIMLowy.
        static public String nazwaRozmowcy = "nikt";
        static public List<String> juzRozmawialismy = new List<String>();
        static String ostatniaOdebranaWiadomosc;
        static public Wspolrzedne pozycjaRozmowcy = null;
        static public int kierunekPatrzeniaRozmowcy = 0; //0-na północ, 1-na wschód, 2-na południe, 3-na zachód
        static public int wysokoscRozmowcy;

        #region Słuchanie

        static public String Listen(String krzyczacyAgent, String komunikat)
        {
            if (krzyczacyAgent == Agent.getNazwa())
            {
                Console.WriteLine("~Słyszę własne słowa~");
                Console.WriteLine("Krzyczę: " + komunikat);
                return null;
            }
            else
            {
                Console.WriteLine(krzyczacyAgent + ": " + komunikat);
                if ((nazwaRozmowcy == krzyczacyAgent)||(nazwaRozmowcy == "nikt"))
                {
                    if (!Program.czyGracz())
                    {
                        nazwaRozmowcy = krzyczacyAgent;
                        ostatniaOdebranaWiadomosc = komunikat;
                        InterpretujWiadomosc();
                        return Rozmawiaj();
                    }
                }
            }
            return null;
        }

        static private void InterpretujWiadomosc()
        {
            if (ostatniaOdebranaWiadomosc == "Musze konczyc!")
                return;
            if (ostatniaOdebranaWiadomosc.StartsWith("Stoj! "))
            {
                String rozpatrywany = ostatniaOdebranaWiadomosc.Substring(36);
                String[] rozbityRozpatrywany = rozpatrywany.Split('_');
                int xRoz = int.Parse(rozbityRozpatrywany[0]);
                int yRoz = int.Parse(rozbityRozpatrywany[1]);
                pozycjaRozmowcy = new Wspolrzedne(Agent.getPozycjaAgenta().getX() + xRoz,
                    Agent.getPozycjaAgenta().getY() + yRoz);
                wysokoscRozmowcy = int.Parse(rozbityRozpatrywany[2]) + Agent.getWysokosc();
                int tempObrot = int.Parse(rozbityRozpatrywany[3]);
                switch (tempObrot)
                {
                    case 0:
                        kierunekPatrzeniaRozmowcy = Agent.getKierunekPatrzenia();
                        break;
                    case 1:
                        kierunekPatrzeniaRozmowcy = (Agent.getKierunekPatrzenia() + 1) % 4;
                        break;
                    case 2:
                        kierunekPatrzeniaRozmowcy = (Agent.getKierunekPatrzenia() + 2) % 4;
                        break;
                    case 3:
                        kierunekPatrzeniaRozmowcy = (Agent.getKierunekPatrzenia() + 3) % 4;
                        break;
                }
                ZnanaMapa.przyjmijMapeZeStringa(rozbityRozpatrywany[4]);
            }

            if (ostatniaOdebranaWiadomosc.StartsWith("Moja mapa to:"))
            {
                String rozpatrywany = ostatniaOdebranaWiadomosc.Substring(13);
                ZnanaMapa.przyjmijMapeZeStringa(rozpatrywany);
            }
        }

        #endregion

        #region Mówienie

        static public void Speak(AgentAPI agent, String wiadomosc)
        {
            if (!agent.Speak(wiadomosc, 1))
                Console.WriteLine("Mowienie nie powiodlo sie - brak energii");
            else
            {
                Agent.powiedzialesCos();
            }
        }

        static public String Rozmawiaj()
        {
            if (ostatniaOdebranaWiadomosc == "Musze konczyc!")
            {
                juzRozmawialismy.Add(nazwaRozmowcy);
                nazwaRozmowcy = "nikt";
                pozycjaRozmowcy = null;
                return null;
            }
            if ((Agent.czyLepiejIscDoZrodla())||(!Program.standUp))
            {
                return "Musze konczyc!";
            }
            else
            {
                AIMLbot.User myUser = new AIMLbot.User(nazwaRozmowcy, agentAIML);

                AIMLbot.Request r = new AIMLbot.Request(ostatniaOdebranaWiadomosc, myUser, agentAIML);
                AIMLbot.Result res = agentAIML.Chat(r);

                String kopiaOdpowiedzi = res.Output;

                if (ostatniaOdebranaWiadomosc.StartsWith("Stoj! Moja pozycja, obrot i mapa to"))
                {
                    kopiaOdpowiedzi = "Moja mapa to:";
                    kopiaOdpowiedzi += ZnanaMapa.toString();
                    juzRozmawialismy.Add(nazwaRozmowcy);
                    nazwaRozmowcy = "nikt";
                    pozycjaRozmowcy = null;
                }

                return kopiaOdpowiedzi;
            }
        }

        #endregion

    }
}
